{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "496237c1",
   "metadata": {},
   "source": [
    "# EnumOutputParser\n",
    "\n",
    "LangChain의 EnumOutputParser는 언어 모델의 출력을 미리 정의된 열거형(Enum) 값 중 하나로 파싱하는 도구입니다. 이 파서의 주요 특징과 사용법은 다음과 같습니다.\n",
    "\n",
    "## 주요 특징\n",
    "\n",
    "- **열거형 파싱**: 문자열 출력을 미리 정의된 Enum 값으로 변환합니다.\n",
    "- **타입 안전성**: 파싱된 결과가 반드시 정의된 Enum 값 중 하나임을 보장합니다.\n",
    "- **유연성**: 공백이나 줄바꿈 문자를 자동으로 처리합니다.\n",
    "\n",
    "## 사용 방법\n",
    "\n",
    "EnumOutputParser는 언어 모델의 출력에서 유효한 Enum 값을 추출하는 데 유용합니다. 이를 통해 출력 데이터의 일관성을 유지하고 예측 가능성을 높일 수 있습니다. 파서를 사용하려면, 미리 정의된 Enum 값을 설정하고 해당 값을 기준으로 문자열 출력을 파싱합니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "40e36b45",
   "metadata": {},
   "outputs": [],
   "source": [
    "from dotenv import load_dotenv\n",
    "\n",
    "load_dotenv()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "28e7c6fa",
   "metadata": {},
   "outputs": [],
   "source": [
    "# LangSmith 추적을 설정합니다. https://smith.langchain.com\n",
    "# !pip install langchain-teddynote\n",
    "from langchain_teddynote import logging\n",
    "\n",
    "# 프로젝트 이름을 입력합니다.\n",
    "logging.langsmith(\"CH03-OutputParser\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "63a7ed1c",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.output_parsers.enum import EnumOutputParser"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d1fd5ea",
   "metadata": {},
   "source": [
    "- `enum` 모듈을 사용하여 `Colors` 클래스를 정의합니다.\n",
    "- `Colors` 클래스는 `Enum`을 상속받으며, `RED`, `GREEN`, `BLUE` 세 가지 색상 값을 가집니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9a50615a",
   "metadata": {},
   "outputs": [],
   "source": [
    "from enum import Enum\n",
    "\n",
    "\n",
    "class Colors(Enum):\n",
    "    RED = \"빨간색\"\n",
    "    GREEN = \"초록색\"\n",
    "    BLUE = \"파란색\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9bc8eced",
   "metadata": {},
   "source": [
    "`EnumOutputParser` 를 생성합니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "029d7efd",
   "metadata": {},
   "outputs": [],
   "source": [
    "# EnumOutputParser 인스턴스 생성\n",
    "parser = EnumOutputParser(enum=Colors)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d92998af",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_core.prompts import PromptTemplate\n",
    "from langchain_openai import ChatOpenAI\n",
    "\n",
    "# 프롬프트 템플릿을 생성합니다.\n",
    "prompt = PromptTemplate.from_template(\n",
    "    \"\"\"다음의 물체는 어떤 색깔인가요?\n",
    "\n",
    "Object: {object}\n",
    "\n",
    "Instructions: {instructions}\"\"\"\n",
    "    # 파서에서 지시사항 형식을 가져와 부분적으로 적용합니다.\n",
    ").partial(instructions=parser.get_format_instructions())\n",
    "\n",
    "# 체인을 생성합니다.\n",
    "chain = prompt | ChatOpenAI() | parser"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f5ef8d89",
   "metadata": {},
   "source": [
    "- `chain.invoke` 함수를 사용하여 \"하늘\"에 대한 정보를 요청합니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e53d3497",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 체인을 실행합니다.\n",
    "response = chain.invoke({\"object\": \"하늘\"})\n",
    "print(response)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4c5923dd",
   "metadata": {},
   "source": [
    "결과를 확인합니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f6f4b093",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 출력의 타입을 확인합니다.\n",
    "type(response)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3bba9750",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 출력의 값을 확인합니다.\n",
    "response.value"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py-test",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
